package wxk.interview.sort;

/**
 * 插入排序
 * 一般来说，插入排序都采用in-place在数组上实现。具体算法描述如下：
 * 1.从第一个元素开始，该元素可以认为已经被排序
 * 2.取出下一个元素，在已经排序的元素序列中从后向前扫描
 * 3.如果该元素（已排序）大于新元素，将该元素移到下一位置
 * 4.重复步骤3，直到找到已排序的元素小于或者等于新元素的位置
 * 5.将新元素插入到该位置后
 * 6.重复步骤2~5
 *
 * @author wangxuekai
 * @version 1.0
 * @date 2017/3/4.
 */
public class InsertionSort extends AbstractSort {
    public void sort(int[] arr) {
        doSort(arr);
        print(arr);
    }

    private void doSort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int v = arr[i];
            for (int j = i - 1; j >= 0; j--) {
                if (v >= arr[j]) {
                    arr[j + 1] = v;
                    break;
                }
                swap(arr, j, j + 1);
            }
        }
    }
}
